#include"mystdio.h"

FILE_ *fopen_(const char* path_name,const char *mode)//路径 权限
{
  int flags=0;
  int Moded=0666;
  if(strcmp(mode,"r")==0)
  {
    flags|=O_RDONLY;
   }
  else if(strcmp(mode,"w")==0)
  {
   flags|=(O_WRONLY|O_CREAT|O_TRUNC);
  }
  else if(strcmp(mode,"a")==0)
  {
    flags|=(O_WRONLY|O_CREAT|O_APPEND);
  }else 
  {
    //TODO
  }
  int fd=0;
  if(flags&O_RDONLY) fd=open(path_name,flags);
  else fd=open(path_name,flags,Moded);
  if(fd<0)
  {
    const char* err=strerror(errno);
    write(2,err,strlen(err));
   return NULL;
  }

  FILE_ *fp=(FILE_*)malloc(sizeof(FILE_));
  assert(fp);// 失败就断言
//成功就初始化
fp->flags=SYNC_LINE;//默认行缓冲
fp->fileno=fd;//文件描述符
fp->cap=SIZE;//容量
fp->size=0;//使用量
memset(fp->buffer,0,SIZE);//缓冲区初始化为0
return fp;//成功就返回FILE*指针
}


void fwrite_(const void *ptr,int num,FILE_ *fp)//去向 大小 来源
{
   //1.写到缓冲区里
   memcpy(fp->buffer+fp->size,ptr,num);//des,sor,size 
   fp->size+=num;
   //2.判断是否刷新了
   if(fp->flags&SYNC_NOW)
   {
     //写到文件里
     write(fp->fileno,fp->buffer,fp->size);
     fp->size=0;
   }
   else if(fp->flags&SYNC_FULL)
   {
    if(fp->size==fp->cap)
     {
     write(fp->fileno,fp->buffer,fp->size);
     fp->size=0;
     }
  } 
   else if(fp->flags& SYNC_LINE)
   {
     if(fp->buffer[fp->size-1]=='\n')//不考虑abcd\nabab
     {
     write(fp->fileno,fp->buffer,fp->size);
     fp->size=0;
     }
   }
   else 
   {
     //FAIL
   }

}
void fflush_(FILE_* fp)
{
 // if(fp->size>0) write(fp->fileno,fp->buffer,fp->size);
fsync(fp->fileno);//强制刷新内核缓冲区
fp->size=0;
}
void fclose_(FILE_ *fp)//来源
{
  fflush_(fp);
  close(fp->fileno);
}
